﻿#include <iostream>   // 用于标准输入输出 (cout, endl)
#include <string>     // 包含 std::string 类
#include <vector>     // 包含 std::vector 容器
#include <sstream>    // 包含字符串流类 (istringstream)
#include <algorithm>  // 包含算法函数 (transform)
#include <cctype>     // 包含字符处理函数 (toupper)

int main() {
    // ========== 1. 构造和初始化 ==========
    // 使用字符串字面量初始化一个 std::string 对象
    std::string text = "The quick brown fox jumps over the lazy dog";
    std::cout << "Original text: " << text << std::endl;

    // ========== 2. 查找操作 ==========
    // 在字符串中查找子串 "fox"
    // find() 返回子串首次出现的起始位置，如果没找到返回 std::string::npos
    size_t pos = text.find("fox");

    // 检查是否找到
    if (pos != std::string::npos) {//std::string::npos 是一个特殊的静态常量成员，表示"未找到"或"无效位置"。
        std::cout << "Found 'fox' at position: " << pos << std::endl;
        std::cout << "The substring is: " << text.substr(pos, 3) << std::endl; // 提取找到的子串
    }
    else {
        std::cout << "'fox' not found in the text." << std::endl;
    }

    // ========== 3. 替换操作 ==========
    // 将找到的 "fox" (从位置pos开始，长度为3) 替换为 "cat"
    // replace() 参数: (起始位置, 要替换的字符数, 新字符串)
    text.replace(pos, 3, "cat");
    std::cout << "After replacement: " << text << std::endl;

    // ========== 4. 字符串转换 ==========
    // 使用 STL 算法将整个字符串转换为大写
    // transform() 参数: 
    //   - 输入范围的开始和结束迭代器
    //   - 输出位置的开始迭代器 (通常是原位置，表示原地修改)
    //   - 转换函数 (::toupper 将字符转换为大写)
    std::transform(text.begin(), text.end(), text.begin(), ::toupper);
    std::cout << "Uppercase: " << text << std::endl;

    // ========== 5. 字符串分割 ==========
    // 使用字符串流来分割字符串，这是最常用的分割方法之一

    // 创建一个输入字符串流，用 text 的内容初始化它
    // istringstream 允许我们像操作输入流一样操作字符串
    std::istringstream iss(text);

    // 创建 vector 来存储分割后的单词
    std::vector<std::string> words;

    // 临时变量，用于存储每次读取的单词
    std::string word;

    // 使用流提取运算符 >> 按空格分割字符串
    // 每次循环读取一个单词（遇到空格停止）
    while (iss >> word) {
        // 将读取到的单词添加到 vector 中
        words.push_back(word);
    }

    // ========== 6. 结果输出 ==========
    std::cout << "\nSplit words:" << std::endl;

    // 使用基于范围的 for 循环遍历并输出所有单词
    // const auto& 避免拷贝，提高效率
    for (const auto& w : words) {
        std::cout << "- " << w << std::endl;
    }

    // 输出单词总数
    std::cout << "Total words count: " << words.size() << std::endl;

    // ========== 7. 其他实用操作演示 ==========
    std::cout << "\nAdditional operations:" << std::endl;

    // 获取字符串长度
    std::cout << "Text length: " << text.length() << " characters" << std::endl;

    // 检查字符串是否包含特定子串 (C++20)
    // std::cout << "Contains 'DOG': " << text.contains("DOG") << std::endl;

    // 获取子串 - 提取前3个单词
    size_t firstSpace = text.find(' ');
    size_t secondSpace = text.find(' ', firstSpace + 1);
    size_t thirdSpace = text.find(' ', secondSpace + 1);

    if (thirdSpace != std::string::npos) {
        std::string firstThreeWords = text.substr(0, thirdSpace);
        std::cout << "First three words: " << firstThreeWords << std::endl;
    }

    // 清空字符串
    text.clear();
    std::cout << "After clear(), text is empty: " << (text.empty() ? "Yes" : "No") << std::endl;

    return 0;
}

/* 预期输出:
Original text: The quick brown fox jumps over the lazy dog
Found 'fox' at position: 16
The substring is: fox
After replacement: The quick brown cat jumps over the lazy dog
Uppercase: THE QUICK BROWN CAT JUMPS OVER THE LAZY DOG

Split words:
- THE
- QUICK
- BROWN
- CAT
- JUMPS
- OVER
- THE
- LAZY
- DOG
Total words count: 9

Additional operations:
Text length: 44 characters
First three words: THE QUICK BROWN
After clear(), text is empty: Yes
*/